package code.class3;

/**
 * https://leetcode.cn/problems/find-the-duplicate-number/description/
 * 寻找重复数
 * 给定一个包含 n + 1 个整数的数组 nums ，其数字都在 [1, n] 范围内（包括 1 和 n），可知至少存在一个重复的整数。
 * 假设 nums 只有 一个重复的整数 ，返回 这个重复的数 。
 * 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
 *
 * 解题思路：使用快慢指针
 */
public class Code03_findDuplicate {
    public static void main(String[] args) {
        int[] arr = {3, 1, 4, 5, 2, 6, 4};
        int repeatNum = findDuplicate(arr);
        System.out.println(repeatNum);
    }

    // 环型数组，快慢指针
    public static int findDuplicate(int[] arr) {
        if (arr == null || arr.length < 2) {
            return -1;
        }
        int slow = arr[0];
        int fast = arr[arr[0]];
        while (fast != slow) {
            slow = arr[slow];
            fast = arr[arr[fast]];
        }
        fast = 0;
        while (slow != fast) {
            slow = arr[slow];
            fast = arr[fast];
        }
        return slow;
    }
}
